package com.cos.lession53.services.impl;

import com.cos.lession53.dao.EmpMapper;
import com.cos.lession53.entity.Emp;
import com.cos.lession53.services.EmpServices;
import org.aspectj.apache.bcel.generic.RET;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;

/**
 * @author: COS
 * @time: 2022/3/8 9:21
 * @description:
 * @Service 业务层专用注解
 * @Service没有其他属性的时候
 * 作用 相当于 <bean id="empServicesImpl(类名首字母小写)" class="com.cos.lession53.services.impl.EmpServicesImpl"/>
 * @Service("empServices") 指定了id的值
 * 相当于 <bean id="empServices" class="com.cos.lession53.services.impl.EmpServicesImpl"/>
 *
 * @Component @Repository 作用和dservices一样
 *  @Repository 专门用于dao的实现类 ,mybatis的dao实现类由spring生成,用不上
 *  @Component 专门用于不属于 dao services servlet/controller 等等第三方组件或者工具类 使用的注解
 *  @Service 专门用于业务层
 */
@Service("empServices")
//@Scope()// 用于设置单例或者多里的模式
//@Component("empServices")
//@Repository("empServices")
//事务解决 写在类上面 这个全全体都使用这个注解的事务的策略
@Transactional(isolation = Isolation.DEFAULT,propagation = Propagation.REQUIRED,rollbackFor = Exception.class,timeout = -1)
public class EmpServicesImpl implements EmpServices {
    //empmapper
    //byType 根据数据类型自动注入 只要类型相融就可以 父类 接受子类 接口可以实现类
    //byName 根据id的值的属性名和id的值一致就自动注入
    //@Autowired // 默认使用byType 的属性进行自动注入 自动在spring里面找有没有对应的值,有就自动注入
    //@Qualifier("empMapper") //在autowired基础上在加这个注解 就是制定bean name 来自动注入,相对byName的注入方式
    @Resource
    /*
    在不指定beanname的时候,会先使用属性的名字,来作为beanName 使用byName进行注入
    如果使用bean name找不到对应的值,就会自动找类型(byType)进行注入
    2种方式都会进行使用,
    并且属于java注解
     */
    private EmpMapper mapper;

    @Override
    public void xxxx(){
        System.out.println("这个services可用");
    }
    //方法上事务注解优先使用
    @Transactional(timeout = 100)
    @Override
    public boolean updateEmp(Emp e) {
        if (e != null) {
            if (mapper.updateEmp(e)>0) {
                return true;
            }
        }
        return false;
    }

    @Transactional(readOnly = true)
    @Override
    public Emp getEmByName(String ename) {
        if (ename != null&&ename.trim().length()>0) {
            System.out.println(10/0);
           return mapper.getEmByName(ename);
        }
        return null;
    }

    public EmpMapper getMapper() {
        return mapper;
    }

    public void setMapper(EmpMapper mapper) {
        this.mapper = mapper;
    }
}
